package ifrn.agendaweb.controlador;

import ifrn.agendaweb.modelo.Compromisso;
import ifrn.agendaweb.modelo.Usuario;
import ifrn.agendaweb.modelo.validador.CompromissoValidador;
import ifrn.agendaweb.servico.CompromissoServico;
import ifrn.agendaweb.servico.ServicoException;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/pri/compromisso/**")
public class CompromissoControlador {

	private CompromissoServico compromissoServico;
	@Autowired
	public void setCompromissoServico(CompromissoServico compromissoServico) {
		this.compromissoServico = compromissoServico;
	}
	
	@Autowired
	Compromisso compromisso;
	
	@Autowired
	Usuario usuarioSessao;

	/*validador*/
	@Autowired
    private CompromissoValidador compromissoValidador;
 
	@InitBinder
	protected void initBinder(WebDataBinder binder) {
		binder.setValidator(new CompromissoValidador());
		binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("dd/MM/yyyy"), false));
	}


	@RequestMapping("/")
	public String exibir(@RequestParam("id") Integer id, Model modelo, Compromisso compromisso) {
		
		try {
			compromisso.setId(id);
			compromisso = compromissoServico.recuperarCompromissoComContato(compromisso);
			modelo.addAttribute("compromisso", compromisso);
			return "compromisso.detalhe";
		} catch (Exception pex) {
			modelo.addAttribute("erro", pex.getMessage());
			return listar(modelo);
		}
	}
	
	@RequestMapping("/index")
	public String cadastro(Model modelo) {
		modelo.addAttribute("compromisso", new Compromisso());
		return "compromisso.formulario";
	}
	
	@RequestMapping("/formularioAtualizar")
	public String formularioAtualizar(@RequestParam("id") Integer id, Model modelo, Compromisso compromisso) {
		try {
			compromisso.setId(id);
			
			compromisso = compromissoServico.recuperarCompromissoComContato(compromisso);
			compromisso.setAddContatos(compromisso.contatosToAddContatos());

			modelo.addAttribute("compromisso", compromisso);
			return "compromisso.formularioAtualizar";
		} catch (Exception pex) {
			modelo.addAttribute("erro", pex.getMessage());
			return listar(modelo);
		}
	}


	@RequestMapping(value="/criar", method=RequestMethod.POST)
	public String create(@Valid Compromisso compromisso, BindingResult result, Model modelo){

		
		//verifica se os campos dos formulários são válidos
		if (!result.hasFieldErrors()) {
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");

			try {
//				HttpSession session = request.getSession();
				compromisso.setUsuario(usuarioSessao);
				
				compromisso.setDataInicial(sdf.parse(compromisso.getDataInicialFormulario()));
				compromisso.setDataFinal(sdf.parse(compromisso.getDataFinalFormulario()));
				
				compromisso.setContatos(compromisso.addContatosToContatos());
				
				//cria o compromisso
				this.compromissoServico.criar(compromisso);
				
				compromisso = compromissoServico.recuperarCompromissoComContato(compromisso);
				modelo.addAttribute("sucesso", "Compromisso adicionado com sucesso.");
				modelo.addAttribute("compromisso", compromisso);
				
			} //se ocorrer alguma exceção
			catch (ServicoException e) {
				//envia a mensagem de erro
				modelo.addAttribute("erro", e.getMessage());
				return "compromisso.formulario";
			}
			catch (ParseException pe) {
				//envia a mensagem de erro
				modelo.addAttribute("erro", "A data foi informada no formato errado. Formato de exemplo: "+ sdf.format(new Date()));
				return "compromisso.formulario";
			}
			
			return "compromisso.detalhe";

		} else {
			return "compromisso.formulario";
		}
		
	}
	

	@RequestMapping(value="/atualizar", method=RequestMethod.POST)
	public String atualizar(@Valid Compromisso compromisso, BindingResult result, Model modelo){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm");
		//verifica se os campos dos formulários são válidos
		if (!result.hasFieldErrors()) {

			try {
				compromisso.setUsuario(usuarioSessao);
				compromisso.setDataInicial(sdf.parse(compromisso.getDataInicialFormulario()));
				compromisso.setDataFinal(sdf.parse(compromisso.getDataFinalFormulario()));
				
				compromisso.setContatos(compromisso.addContatosToContatos());
				
				//atualiza compromisso
				this.compromissoServico.atualizar(compromisso);
				
				compromisso = compromissoServico.recuperarCompromissoComContato(compromisso);
				modelo.addAttribute("sucesso", "Compromisso alterado com sucesso.");
				modelo.addAttribute("compromisso", compromisso);
				
			} //se ocorrer alguma exceção
			catch (ServicoException e) {
				//envia a mensagem de erro
				modelo.addAttribute("erro", e.getMessage());
				return "compromisso.formularioAtualizar";
			}
			catch (ParseException pe) {
				//envia a mensagem de erro
				modelo.addAttribute("erro", "A data foi informada no formato errado. Formato de exemplo: "+ sdf.format(new Date()));
				return "compromisso.formulario";
			}
			
			return "compromisso.detalhe";

		} else {
			return "compromisso.formularioAtualizar";
		}
		
	}
	
	
	@RequestMapping(value="/excluir", method=RequestMethod.POST)
	public String excluir(@Valid Compromisso compromisso, BindingResult result, Model modelo){
		try {
			
			//atualiza compromisso
			this.compromissoServico.deletar(compromisso);
			
			modelo.addAttribute("sucesso", "Compromisso excluído com sucesso.");
			
		} //se ocorrer alguma exceção
		catch (ServicoException e) {
			//envia a mensagem de erro
			modelo.addAttribute("erro", e.getMessage());
		}
		
		
		//recupera listagem dos compromissos
		try {
			List<Compromisso> compromissos = compromissoServico.recuperarCompromisso(usuarioSessao);
			modelo.addAttribute("compromissos", compromissos);
		} catch (Exception e) {
			modelo.addAttribute("erro", e.getMessage());
		}
		
		
		return "compromisso.listagem";

	}
	
	//listagem de compromissos
	@RequestMapping("/listar")
	public String listar(Model modelo) {
		try {
			List<Compromisso> compromissos = compromissoServico.recuperarCompromisso(usuarioSessao);
			modelo.addAttribute("compromissos", compromissos);
		} catch (Exception ex) {
			modelo.addAttribute("erro", ex.getMessage());
			// TODO: handle exception
		}
		
		return "compromisso.listagem";	
	}
	
}
